home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 61266 / 61266.xpi / chrome / content / ff-overlay.js < prev    next >
Text File  |  2010-02-08  |  18KB  |  497 lines

  1. if(!com) var com={};
  2. if(!com.chechurin) com.chechurin={};
  3.  
  4. // Helper functions
  5. com.chechurin.utils = {
  6.     // Set specific style to element or array of elements
  7.     // Usage:
  8.     // setStyle([div, someSpan], 'position', 'absolute')
  9.     setStyle: function(elements, prop, value){
  10.                   for (var i = 0, len = elements.length-1; i <= len; ++i) {
  11.                       elements[i].style[prop] = value;
  12.                   }
  13.               },
  14.     // Add css styles to element or array elements
  15.     // Usage:
  16.     // css([foo, bar],{
  17.     // position: 'absolute',
  18.     // width: '100px'
  19.     // })
  20.     css: function(el, styles){
  21.              for (var prop in styles){
  22.                  if (!styles.hasOwnProperty(prop)) continue;
  23.                  com.chechurin.utils.setStyle(el, prop, styles[prop]);
  24.              }
  25.          }
  26. };
  27. com.chechurin.beststickynotes = function(){
  28.     var ECHE = com.chechurin.utils;
  29.     // Load sticky notes CSS to global stylessheets
  30.     var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"]
  31.                     .getService(Components.interfaces.nsIStyleSheetService);
  32.     var ios = Components.classes["@mozilla.org/network/io-service;1"]
  33.                     .getService(Components.interfaces.nsIIOService);
  34.     var uri = ios.newURI("chrome://beststickynotes/skin/overlay.css", null, null);
  35.     if(!sss.sheetRegistered(uri, sss.USER_SHEET))
  36.         sss.loadAndRegisterSheet(uri, sss.USER_SHEET);
  37.     
  38.  
  39.     var BASE_Z_INDEX = 100000;
  40.  
  41.     var STATE_DISPLAY = 0;
  42.     var STATE_EDIT    = 1;
  43.     var STATE_MOVE    = 2;
  44.     var STATE_RESIZE  = 3;
  45.    
  46.     // Min widh/height
  47.     var MIN_WIDTH = 200;
  48.     var MIN_HEIGHT;
  49.     var YpageXOffset, YpageYOffset;
  50.     // Sticky Notes class
  51.     var StickyNote = function(x, y, width, height, text, doc){
  52.         doc = doc || window.content.document;
  53.     var bod = doc.getElementsByTagName('body')[0];
  54.     
  55.         var stickyNote = this;
  56.  
  57.     stickyNote._moveX = 0;
  58.     stickyNote._moveY = 0;
  59.     stickyNote._state = STATE_DISPLAY;
  60.  
  61.     stickyNote.container = doc.createElement("div");
  62.     stickyNote._x = x == undefined ? YpageXOffset : x;
  63.     stickyNote._y = y == undefined ? YpageYOffset : y;
  64.     stickyNote._width  = width  == undefined || width  < MIN_WIDTH ? MIN_WIDTH: width;
  65.     stickyNote._height = height == undefined || height < MIN_HEIGHT ? MIN_HEIGHT : height;
  66.     ECHE.css([stickyNote.container],{
  67.                     position: "absolute",
  68.                     left: stickyNote._x + "px",
  69.                     top:  stickyNote._y + "px",
  70.                     width: stickyNote._width + "px",
  71.                     zIndex: BASE_Z_INDEX
  72.                 });
  73.  
  74.     stickyNote.container.className = "eche-best-sticky-note";
  75.     var div = doc.createElement("div");
  76.     div.className = "eche-best-sticky-note-top";
  77.     div.style.MozUserSelect="none";
  78.  
  79.     var topTitle = doc.createElement("span");
  80.  
  81.     topTitle.appendChild(doc.createTextNode("Xsticky-Tool"));
  82.         div.appendChild(topTitle);
  83.  
  84.  
  85.         // Remove Sticky note button
  86.         var a = doc.createElement("a");
  87.  
  88.         // Remove Method
  89.     stickyNote.remove = function() {
  90.         stickyNote.container.parentNode.removeChild(stickyNote.container);
  91.     };
  92.  
  93.         // Remove button click listener
  94.     a.addEventListener("click", function() {
  95.         if (window.confirm("Current Note will be completely removed. Continue?")) 
  96.                 {
  97.                     stickyNote.remove();
  98.                     removeStickyNote(stickyNote);
  99.                 }
  100.  
  101.  
  102.     }, true);
  103.         
  104.         var removeImg = doc.createElement("img");
  105.         removeImg.src = "chrome://beststickynotes/skin/xsticky/close1.jpg";
  106.  
  107.     a.className = "eche-best-sticky-note-top-close";
  108.     a.title="Remove this sticky note";
  109.         a.appendChild(removeImg);
  110.     div.appendChild(a);
  111.     
  112.         // Minimize Sticky note button
  113.         var min = doc.createElement("a");
  114.  
  115.         // Minimize button click listener
  116.     min.addEventListener("click", function() {
  117.         stickyNote.displayText.style.display = stickyNote.displayText.style.display == "none" ? "block" : "none";
  118.                 minImg.src = minImg.src == "chrome://beststickynotes/skin/xsticky/minimize1.jpg" ? "chrome://beststickynotes/skin/xsticky/maximize1.jpg" : "chrome://beststickynotes/skin/xsticky/minimize1.jpg";
  119.     }, true);
  120.         
  121.         var minImg = doc.createElement("img");
  122.         minImg.src = "chrome://beststickynotes/skin/xsticky/minimize1.jpg";
  123.  
  124.     min.className = "eche-best-sticky-note-top-close";
  125.     min.title="Minimize this sticky note";
  126.         min.appendChild(minImg);
  127.     div.appendChild(min);
  128.         
  129.     // Settings Sticky note button
  130.         var settings = doc.createElement("a");
  131.  
  132.         // Settings button click listener
  133.     settings.addEventListener("click", function() {
  134.                 alert("Current Note properties still in development, wait for update.");
  135.     }, true);
  136.         
  137.         var setImg = doc.createElement("img");
  138.         setImg.src = "chrome://beststickynotes/skin/xsticky/properties1.jpg";
  139.  
  140.     settings.className = "eche-best-sticky-note-top-close";
  141.         settings.title="Current sticky note properties";
  142.         settings.appendChild(setImg);
  143.     div.appendChild(settings);
  144.         
  145.         // Append Sticky body to container
  146.         stickyNote.container.appendChild(div);
  147.  
  148.     var resizeGrabber = doc.createElement("div");
  149.     resizeGrabber.className = "eche-best-sticky-note-resize-grabber";
  150.     stickyNote.container.appendChild(resizeGrabber);
  151.  
  152.     stickyNote.displayText = doc.createElement("div");
  153.         stickyNote.displayText.title = "double click to edit sticky note";
  154.     stickyNote.displayText.className = "eche-best-sticky-note-display-text";
  155.     
  156.         stickyNote.editText    = doc.createElement("textarea");
  157.     stickyNote.editText.className = "eche-best-sticky-note-edit-text";
  158.         
  159.     ECHE.css([stickyNote.displayText,stickyNote.editText],{
  160.                     fontFamily: prefs.getCharPref("font"),
  161.                     fontSize: prefs.getIntPref("fontsize") + "pt",
  162.                     lineHeight: prefs.getIntPref("fontsize")*2 + "px",
  163.                     height: stickyNote._height + "px"
  164.                 });
  165.  
  166.     ECHE.css([stickyNote.editText],{
  167.                     display: "none",
  168.                 border: "none",
  169.                     margin: "0px",
  170.                 });
  171.     ECHE.css([stickyNote.displayText],{
  172.                     opacity: prefs.getCharPref("transparency")
  173.                 });
  174.     
  175.         // Bottom div constructor
  176.         var divBottom = doc.createElement("div");
  177.         divBottom.className = "eche-best-sticky-note-bottom";
  178.     divBottom.style.MozUserSelect="none";
  179.     
  180.         var home = doc.createElement("a");
  181.  
  182.         home.href = "http://xsticky.com/";
  183.         // Home button click listener
  184.     home.addEventListener("click", function(event) {
  185.             event.stopPropagation();
  186.             event.preventDefault();
  187.             gBrowser.selectedTab = gBrowser.addTab("http://xsticky.com/");
  188.     }, true);
  189.         var homeImg = doc.createElement("img");
  190.         homeImg.src = "chrome://beststickynotes/skin/xsticky/home1.jpg";
  191.         home.appendChild(homeImg);
  192.  
  193.         divBottom.appendChild(home);
  194.  
  195.  
  196.     stickyNote.container.appendChild(stickyNote.displayText);
  197.     stickyNote.container.appendChild(stickyNote.editText);
  198.     stickyNote.container.appendChild(divBottom);
  199.         
  200.  
  201.         // Resize grabber event listener
  202.     resizeGrabber.addEventListener("mousedown", function(e) {
  203.         if (e.button == 0 && stickyNote._state != STATE_EDIT) {
  204.                         stickyNote.eventHelper(e, STATE_RESIZE);
  205.             return false;
  206.         }
  207.         return true;
  208.     }, true);
  209.         
  210.         // Mouse up, down, move event listeners
  211.     div.addEventListener("mousedown", function(e) {
  212.         if (e.button == 0 && stickyNote._state == STATE_DISPLAY) {
  213.             stickyNote.eventHelper(e, STATE_MOVE);
  214.                         div.style.cursor = "move";
  215.             return false;
  216.         }
  217.         return true;
  218.     }, true);
  219.     
  220.     window.addEventListener("mouseup", function(e) {
  221.         if (e.button == 0 && (stickyNote._state == STATE_MOVE || stickyNote._state == STATE_RESIZE)) {
  222.             bod.style.MozUserSelect="text";
  223.                         div.style.cursor = "default";
  224.             stickyNote._state = STATE_DISPLAY;
  225.             saveStickyNotes(stickyNote);
  226.         }
  227.     }, true);
  228.     
  229.     window.addEventListener("mousemove", function(e) {
  230.         switch (stickyNote._state) {
  231.         case STATE_MOVE:
  232.                         
  233.             stickyNote._x += e.pageX - stickyNote._moveX;
  234.             stickyNote._y += e.pageY - stickyNote._moveY;
  235.  
  236.             stickyNote.container.style.left = stickyNote._x + "px";
  237.             stickyNote.container.style.top  = stickyNote._y + "px";
  238.             
  239.             stickyNote._moveX = e.pageX;
  240.             stickyNote._moveY = e.pageY;
  241.             return false;
  242.         case STATE_RESIZE:
  243.             var newWidth  = stickyNote._width  + e.pageX - stickyNote._moveX;
  244.             var newHeight = stickyNote._height + e.pageY - stickyNote._moveY;
  245.  
  246.             if (newWidth >= MIN_WIDTH) {
  247.                 stickyNote._width = newWidth;
  248.                 stickyNote._moveX = e.pageX;
  249.                 stickyNote.container.style.width = stickyNote._width + "px";
  250.             }
  251.  
  252.             if (newHeight >= MIN_HEIGHT) {
  253.                 stickyNote._height = newHeight;
  254.                 stickyNote._moveY  = e.pageY;
  255.                 stickyNote.editText.style.height = stickyNote.displayText.style.height = stickyNote._height + "px";
  256.             }
  257.  
  258.             return false;
  259.         }
  260.         return true;
  261.     }, true);
  262.         
  263.         // Dbclick on Sticky Note listener
  264.     stickyNote.container.addEventListener("dblclick", function() {    
  265.             // stickyNote.displayText.style.opacity = "1";
  266.         stickyNote.displayText.style.display="none";
  267.         stickyNote.editText.style.display="block";
  268.         stickyNote._state = STATE_EDIT;
  269.         stickyNote.editText.focus();
  270.     }, true);
  271.  
  272.         // End of editing Sticky Note
  273.     function endEdit() {
  274.             stickyNote.displayText.style.opacity = prefs.getCharPref("transparency");
  275.         stickyNote.displayText.style.display="block";
  276.         stickyNote.editText.style.display="none";
  277.         stickyNote._state = STATE_DISPLAY;
  278.         stickyNote.displayText.innerHTML = stickyNote.editText.value.replace(/\n/g,"<br/>");
  279.         saveStickyNotes(stickyNote);
  280.     };
  281.     
  282.         stickyNote.editText.addEventListener("keyup", function(e) {
  283.         if (e.which == 27) {
  284.             endEdit();
  285.         }
  286.     }, true);
  287.  
  288.     stickyNote.editText.addEventListener("blur", endEdit, true);
  289.  
  290.     stickyNote.getX = function() {
  291.         return stickyNote._x;
  292.     }
  293.  
  294.     stickyNote.getY = function() {
  295.         return stickyNote._y;
  296.     }
  297.  
  298.     stickyNote.getWidth = function() {
  299.         return stickyNote._width;
  300.     }
  301.  
  302.     stickyNote.getHeight = function() {
  303.         return stickyNote._height;
  304.     }
  305.  
  306.     stickyNote.setX = function(x) {
  307.         stickyNote._x = x;
  308.         stickyNote.container.style.left = x + "px";
  309.     }
  310.  
  311.     stickyNote.setY = function(y) {
  312.         stickyNote._y = y;
  313.         stickyNote.container.style.top = y + "px";
  314.     }
  315.  
  316.  
  317.     stickyNote.setWidth = function(width) {
  318.         stickyNote.container.style.width = width + "px";
  319.         stickyNote._width = width;
  320.     }
  321.  
  322.     stickyNote.setHeight = function(height) {
  323.         stickyNote.editText.style.height = stickyNote.displayText.style.height = height + "px";
  324.         stickyNote._height = height;
  325.     }
  326.         
  327.         // Setting Sticky Note text
  328.     stickyNote.setText = function(text) {
  329.         stickyNote.displayText.innerHTML = text.replace(/\n/g,"<br/>");
  330.         stickyNote.editText.value        = text;
  331.     };
  332.  
  333.         // Getting Sticky Note text
  334.     stickyNote.getText = function() {
  335.         return stickyNote.editText.value;
  336.     };
  337.  
  338.         // Events helper function
  339.         stickyNote.eventHelper = function(e, STATE){
  340.         bod.style.MozUserSelect="none";
  341.             this._state = STATE;
  342.             this._moveX = e.pageX;
  343.             this._moveY = e.pageY;
  344.         }
  345.         
  346.     if (text != undefined) {
  347.         stickyNote.setText(text);
  348.     }
  349.     
  350.         stickyNote.displayText.style.MozUserSelect = "none";
  351.     resizeGrabber.style.MozUserSelect="none";
  352.  
  353.  
  354.           bod.appendChild(stickyNote.container);
  355.     };
  356.     
  357.     function saveStickyNotes(stickyNote) {
  358.     if (stickyNotesColl.links.length != 0) {
  359.                 
  360.                 var doc = window.content.document;
  361.                 var uri = doc.location.href;
  362.                 var bTitle = doc.title;
  363.         var pushToColl = true;
  364.                 for (var i = 0; i < stickyNotesColl.links.length; i++ ) {
  365.             if ( stickyNotesColl.links[i] == uri ) {
  366.                 stickyNotesColl.links[i] == uri;
  367.                             stickyNotesColl.text[i]=stickyNote.getText();
  368.                             stickyNotesColl.x[i]=stickyNote.getX();
  369.                             stickyNotesColl.y[i]=stickyNote.getY();
  370.                             stickyNotesColl.width[i]=stickyNote.getWidth();
  371.                             stickyNotesColl.height[i]=stickyNote.getHeight();
  372.                             pushToColl = false;
  373.                         }
  374.         }
  375.                 if(pushToColl){
  376.                 stickyNotesColl.links.push(uri);
  377.                             stickyNotesColl.text.push(stickyNote.getText());
  378.                             stickyNotesColl.x.push(stickyNote.getX());
  379.                             stickyNotesColl.y.push(stickyNote.getY());
  380.                             stickyNotesColl.width.push(stickyNote.getWidth());
  381.                             stickyNotesColl.height.push(stickyNote.getHeight());
  382.                             pushToColl = false;
  383.                             
  384.                             // Creating new bookmark for Sticky Note
  385.                             var bmsvc = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"]
  386.                                 .getService(Components.interfaces.nsINavBookmarksService);
  387.                             uri = ios.newURI(uri, null, null);
  388.                             if (!bmsvc.isBookmarked(uri)) {
  389.                                 bmsvc.insertBookmark(prefs.getIntPref("folderId"), uri, bmsvc.DEFAULT_INDEX, bTitle);
  390.                             }
  391.                         
  392.                 }
  393.         }
  394.         savePreferences();
  395.     }
  396.         
  397.     function removeStickyNote(stickyNote) {
  398.  
  399.         var doc = window.content.document;
  400.         var uri = doc.location.href;
  401.     stickyNotesColl.links   = [note for each (note in stickyNotesColl.links) if (note != uri)];
  402.     stickyNotesColl.x       = [x for each (x in stickyNotesColl.x) if (x != stickyNote.getX())];
  403.     stickyNotesColl.y       = [y for each (y in stickyNotesColl.y) if (y != stickyNote.getY())];
  404.     stickyNotesColl.width   = [width for each (width in stickyNotesColl.width) if (width != stickyNote.getWidth())];
  405.     stickyNotesColl.height  = [height for each (height in stickyNotesColl.height) if (height != stickyNote.getHeight())];
  406.     stickyNotesColl.text    = [text for each (text in stickyNotesColl.text) if (text != stickyNote.getText())];
  407.  
  408.         savePreferences();
  409.     }   
  410.     
  411.     var prefs = Components.classes["@mozilla.org/preferences-service;1"]
  412.                    .getService(Components.interfaces.nsIPrefService);
  413.     prefs = prefs.getBranch("extensions.beststickynotes.");
  414.     
  415.     function savePreferences(){
  416.         prefs.setCharPref("stickyNotes", JSON.stringify(stickyNotesColl));
  417.     }
  418.  
  419.     var stickyNotes = '';
  420.     var stickyNotesColl;
  421.  
  422.     var pub = {};
  423.  
  424.     // On Fx load gets stickyNotes, parses JSON and added event listeners.
  425.     // Also checked if Bookmarks folder created, and if not - creates
  426.     pub.onFirefoxLoad = function(event) {
  427.         // checks existing of bookmarks folder, and creates:
  428.         var bmsvc = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"]
  429.             .getService(Components.interfaces.nsINavBookmarksService);
  430.         var menuFolder = bmsvc.bookmarksMenuFolder; // Bookmarks menu folder
  431.         var folderId = prefs.getIntPref("folderId");
  432.         MIN_HEIGHT = prefs.getIntPref("fontsize")*1.75;
  433.         try
  434.         { 
  435.             bmsvc.getItemType(folderId);
  436.         }
  437.         catch(e) 
  438.         { 
  439.             var newFolderId = bmsvc.createFolder(menuFolder, "Sticky Notes", bmsvc.DEFAULT_INDEX);
  440.             prefs.setIntPref("folderId", newFolderId);
  441.         }
  442.         
  443.         // Gets JSON sticky notes collection
  444.         stickyNotes = prefs.getCharPref("stickyNotes");
  445.         stickyNotesColl = JSON.parse(stickyNotes);
  446.         document.getElementById("contentAreaContextMenu")
  447.             .addEventListener("popupshowing", function (e){ pub.showFirefoxContextMenu(e); }, false);
  448.         var appcontent = document.getElementById("appcontent");   // browser
  449.         if(appcontent)
  450.             appcontent.addEventListener("DOMContentLoaded", pub.onPageLoad, true);
  451.  
  452.     };
  453.     pub.onPageLoad = function(aEvent) {
  454.         var doc = aEvent.originalTarget; // doc is document that triggered "onload" event
  455.         for (i in stickyNotesColl.links){
  456.             if (stickyNotesColl.links[i]==doc.location.href)
  457.             {
  458.                 new StickyNote(stickyNotesColl.x[i], stickyNotesColl.y[i], stickyNotesColl.width[i], stickyNotesColl.height[i], stickyNotesColl.text[i],doc);
  459.             }
  460.         }
  461.     };
  462.  
  463.     pub.showFirefoxContextMenu = function(event) {
  464.         // show or hide the menuitem based on what the context menu is on
  465.         document.getElementById("context-beststickynotes").hidden = gContextMenu.onImage;
  466.     };
  467.  
  468.     pub.addStickyNote = function(e){
  469.         // checked if clicked right mouse button
  470.         e = e || window.event;
  471.         if (e.target.id =="context-beststickynotes")
  472.         {
  473.             var newStickyNote = new StickyNote();
  474.         }
  475.         else if (e.target.id =="beststickynotes-statusbar")
  476.         {
  477.             var doc = doc || window.content.document;
  478.             var bod = doc.getElementsByTagName('body')[0];
  479.             var newStickyNote = new StickyNote((bod.clientWidth-MIN_WIDTH)/2, ((window.innerHeight)/3+doc.defaultView.scrollY));
  480.         }
  481.  
  482.     };
  483.     pub.onClick = function(e) {
  484.         // checked if clicked right mouse button
  485.         e = e || window.event;
  486.         if (e.button == 2 && e.target.id !="beststickynotes-statusbar")
  487.         {
  488.             YpageXOffset = e.pageX;
  489.             YpageYOffset = e.pageY;
  490.         }
  491.     };
  492.     return pub;
  493. }();
  494.  
  495. window.addEventListener("load", com.chechurin.beststickynotes.onFirefoxLoad, false);
  496. window.addEventListener("click", com.chechurin.beststickynotes.onClick, false);
  497.